<?php

namespace EasyDB\Tools;

class Hash
{
    /**
     * 二次md5加密+salt
     * @param string $str 需要加密的字符串
     * @param string $salt 盐
     * @return string
     */
    public static function doubleMd5Encrypt(string $str, string $salt = "")
    {
        $salt = empty($salt) ?? time();
        return md5(md5(trim($str) . $salt));
    }


    /**
     * hash256
     * @param string $data 需要hash的数据
     * @return string
     */
    public static function hash256(string $data)
    {
        return hash("sha256", $data);
    }


    /**
     * 从一个明文值生产哈希
     * @param string $value 需要生产哈希的原文
     * @param integer $cost 递归的层数 可根据机器配置调整以增加哈希的强度
     * @return false|string 返回60位哈希字符串 生成失败返回false
     */
    public static function makePasswordHash($value, $cost = 10)
    {
        return password_hash($value, PASSWORD_BCRYPT, ['cost' => $cost]);
    }

    /**
     * 校验明文值与哈希是否匹配
     * @param string $value
     * @param string $hashValue
     * @return bool
     */
    public static function validatePasswordHash($value, $hashValue)
    {
        return password_verify($value, $hashValue);
    }


    /**
     * 加密方法，对数据进行加密
     * @param string $data 加密数据
     * @param string $secretKey 密钥
     * @param string $iv iv向量
     * @param string $method 方法
     * @return false|string
     */
    public static function encrypt(string $data, string $secretKey, string $iv, string $method = "AES-256-CBC")
    {
        return base64_encode(openssl_encrypt($data, $method, $secretKey, true, $iv));
    }


    /**
     * 需要解密的字符串
     * @param string $str 秘文
     * @param string $secretKey 密钥
     * @param string $iv iv向量
     * @param string $method 方法
     * @return false|string
     */
    public static function decrypt(string $str, string $secretKey, string $iv, string $method = "AES-256-CBC")
    {
        return openssl_decrypt(base64_decode($str), $method, $secretKey, true, $iv);
    }


    /**
     * hashHmac
     * @param string $algo 它是必需的参数，用于指定所选的哈希算法Ex。 “md5”，“sha256”，“sha1”。
     * @param string $data 此参数用于保存要散列的消息。
     * @param string $key 此参数用于指定用于生成消息摘要的HMAC变体的共享 key 。
     * @param bool $rawOpt 此参数用于保存布尔值。如果将其设置为True，则返回原始二进制数据，如果将其设置为False，则返回输出小写十六进制。
     * @return string
     */
    public static function hashHmac($algo, $data, $key, $rawOpt = false)
    {
        return hash_hmac($algo, $data, $key, $rawOpt);
    }
}
